// utils.js 
/**
 * 时间格式化工具
 * @param {Date|string|number} date - 日期对象、字符串或时间戳
 * @param {string} format - 格式化字符串，默认为 'YYYY-MM-DD'
 * @returns {string} - 格式化后的日期字符串
 * 使用示例:
 * formatDate(new Date(), 'YYYY-MM-DD'); // '2024-08-09' YYYY-MM-DD HH:mm:ss
 */
function formatDate(date, format = "YYYY-MM-DD") {
	const d = new Date(date);
	const year = d.getFullYear();
	const month = `0${d.getMonth() + 1}`.slice(-2);
	const day = `0${d.getDate()}`.slice(-2);
	const hours = `0${d.getHours()}`.slice(-2);
	const minutes = `0${d.getMinutes()}`.slice(-2);
	const seconds = `0${d.getSeconds()}`.slice(-2);

	return format
		.replace("YYYY", year)
		.replace("MM", month)
		.replace("DD", day)
		.replace("HH", hours)
		.replace("mm", minutes)
		.replace("ss", seconds);
}


/**
 * 时间戳转换为日期
 * @param {number} timestamp - Unix 时间戳（秒）
 * @param {string} format - 格式化字符串，默认为 'YYYY-MM-DD'
 * @returns {string} - 格式化后的日期字符串
 * 使用示例:
 * timestampToDate(1691577600,' YYYY-MM-DD HH:mm:ss'); // '2023-08-09'
 */
function timestampToDate(timestamp, format = "YYYY-MM-DD") {
	return formatDate(new Date(timestamp * 1000), format);
}

/**
 * 生成指定时间范围内的日期数组
 * @param {string|Date} startDate - 开始日期
 * @param {string|Date} endDate - 结束日期
 * @returns {string[]} - 日期数组
 * 使用示例:
 * generateDateArray('2023-08-01', '2023-08-03'); // ['2023-08-01', '2023-08-02', '2023-08-03']
 */
function generateDateArray(startDate, endDate) {
	const start = new Date(startDate);
	const end = new Date(endDate);
	const dateArray = [];

	while (start <= end) {
		dateArray.push(formatDate(new Date(start)));
		start.setDate(start.getDate() + 1);
	}

	return dateArray;
}

/**
 * 获取日期对应的星期几
 * @param {string|Date} date - 日期字符串或对象
 * @returns {string} - 星期几
 * 使用示例:
 * getDayOfWeek('2023-08-09'); // 'Wednesday'
 */
function getDayOfWeek(date) {
	const daysOfWeek = [
		"Sunday",
		"Monday",
		"Tuesday",
		"Wednesday",
		"Thursday",
		"Friday",
		"Saturday",
	];
	const dayIndex = new Date(date).getDay();
	return daysOfWeek[dayIndex];
}
/**
 * 计算当前时间距离结束时间的时间戳
 * @param {string} [startTime] - 开始时间字符串，支持多种格式，默认为当前时间
 * @param {string} endTime - 结束时间字符串，支持多种格式
 * @returns {number} - 距离结束时间的时间戳（毫秒），如果已过期则返回 0
 * 案例：getTimeUntilEnd('2024-9-30 18:00:00'), 14190223 // 倒计时时间
 */
function getTimeUntilEnd(endTime, startTime = new Date()) {
	const currentTime = Date.now(); // 获取当前时间戳
	const endTimeStamp = new Date(Date.parse(endTime)).getTime(); // 转换结束时间为时间戳
	const startTimeStamp = new Date(Date.parse(startTime)).getTime(); // 转换开始时间为时间戳

	if (isNaN(startTimeStamp) || isNaN(endTimeStamp)) {
		throw new Error("Invalid start or end time format"); // 检查时间格式是否有效
	}

	if (currentTime < startTimeStamp) {
		return Math.max(endTimeStamp - startTimeStamp, 0); // 如果当前时间在开始时间之前，返回结束时间与开始时间的差值
	}

	return Math.max(endTimeStamp - currentTime, 0); // 返回当前时间与结束时间的差值
}


/**
 * 防抖函数
 * @param {Function} func - 要执行的函数
 * @param {number} wait - 等待时间（毫秒）
 * @returns {Function} - 返回防抖处理后的函数
 * 使用示例:
 * 	const handleClick = debounce((e) => {
		console.log('按钮点击');
	}, 1000);
 */
// function debounce(func, wait) {
//   let timeout;
//   return function (...args) {
//     clearTimeout(timeout);
//     timeout = setTimeout(() => func.apply(this, args), wait);
//   };
// }
function debounce(func, wait) {
	let timeout;
	return function(...args) {
		const callNow = !timeout; // 判断是否可以立即调用
		clearTimeout(timeout); // 清除之前的计时器
		timeout = setTimeout(() => {
			timeout = null; // wait 时间过后，清除 timeout
		}, wait);
		if (callNow) {
			func.apply(this, args); // 立即执行函数
		}
	};
}
/**
 * 节流函数
 * @param {Function} func - 要执行的函数
 * @param {number} limit - 限制时间间隔（毫秒）
 * @returns {Function} - 返回节流处理后的函数
 * 使用示例:
 * const handleScroll = throttle(() => console.log('Scroll Event'), 200);
 */
function throttle(func, limit) {
	let lastFunc;
	let lastRan;
	return function(...args) {
		const context = this;
		if (!lastRan) {
			func.apply(context, args);
			lastRan = Date.now();
		} else {
			clearTimeout(lastFunc);
			lastFunc = setTimeout(function() {
				if (Date.now() - lastRan >= limit) {
					func.apply(context, args);
					lastRan = Date.now();
				}
			}, limit - (Date.now() - lastRan));
		}
	};
}

/**
 * 深拷贝
 * @param {object} obj - 要拷贝的对象
 * @returns {object} - 拷贝后的新对象
 * 使用示例:
 * const newObj = deepClone(originalObj);
 */
function deepClone(obj) {
	return JSON.parse(JSON.stringify(obj));
}



// 导出所有工具函数
export {
	formatDate, //时间格式化工具
	timestampToDate, //时间戳转换为日期
	generateDateArray, //生成指定时间范围内的日期数组
	getDayOfWeek, //获取日期对应的星期几
	getTimeUntilEnd, //计算当前时间距离结束时间的时间戳 
	debounce, //防抖函数
	throttle, //节流函数
	deepClone, //深拷贝    
};